home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 3_2004-2005.ISO / Data / Zips / [!!!!!__XT183827192005.psc / Class Modules / clsXThemeRoundTabs.cls < prev    next >
Text File  |  2004-10-27  |  34KB  |  955 lines

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4.   Persistable = 0  'NotPersistable
  5.   DataBindingBehavior = 0  'vbNone
  6.   DataSourceBehavior  = 0  'vbNone
  7.   MTSTransactionMode  = 0  'NotAnMTSObject
  8. END
  9. Attribute VB_Name = "xThemeRoundTabs"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = False
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. 'xThemeRoundTabs : Rounded Tabs example. This just show's a basic idea.
  15. '                  We can do wonders with this and a little APIs.
  16. '
  17. '                  See ITheme for implemented function description
  18.  
  19. Option Explicit
  20.  
  21. Implements ITheme
  22.  
  23. '== Constants ========================================================================================================
  24. Private Const m_c_iFOCUS_RECT_AND_TEXT_DISTANCE = 2  'the distance between the text (caption) of the tab and the focus Rect
  25. Private Const m_c_iPROP_PAGE_BORDER_AND_TEXT_DISTANCE As Integer = 7   'the distance between the text and the border in a Property Pages style tab
  26. Private Const m_c_iPROP_PAGE_INACTIVE_TOP As Integer = 2      'the top for the property page (inactive property page)
  27. '=====================================================================================================================
  28.  
  29. '== Private Variables ================================================================================================
  30.  
  31. Private m_oXTab As XTab
  32. Private m_bIsBackgroundPaintDelayed As Boolean      'See ITheme_DrawBackground() to get a description of this flag
  33.  
  34.  
  35. 'following property are cached (locally) for improved performance
  36. Private m_lHDC As Long
  37. Private m_iActiveTab As Integer
  38. Private m_iActiveTabHeight As Integer
  39. Private m_iInActiveTabHeight As Integer
  40. Private m_iTabCount As Integer
  41. Private m_bIsFocused As Boolean
  42. Private m_iScaleWidth As Integer
  43. Private m_iScaleHeight As Integer
  44. Private m_lOuterBorderColor As Long
  45. Private m_lActiveTabForeColor As Long
  46. Private m_lActiveTabBackStartColor As Long
  47. Private m_lInActiveTabForeColor As Long
  48. Private m_lInActiveTabBackStartColor As Long
  49. Private m_lDisabledTabForeColor As Long
  50. Private m_lDisabledTabBackColor As Long
  51. Private m_iXRadius As Integer
  52. Private m_iYRadius As Integer
  53. Private m_iIconSize As Integer
  54. '=====================================================================================================================
  55.  
  56.  
  57.  
  58. '==== Implemented Functions ==========================================================================================
  59. Private Sub ITheme_DrawBackground()
  60.   ' The below like is added to allow skipping of background paint.
  61.   ' We want to draw the tabs and background one after another for
  62.   ' this theme. We set the flag to true and then call this function
  63.   ' again from the draw tabs() routine
  64.   If Not m_bIsBackgroundPaintDelayed Then
  65.     m_bIsBackgroundPaintDelayed = True
  66.   Else
  67.     Call pCacheControlProperties     'cache the control proerties for faster access
  68.     Select Case m_oXTab.TabStyle
  69.       Case xStyleTabbedDialog:
  70.         Call ITheme_DrawBackgroundTabbedDialog
  71.       Case xStylePropertyPages:
  72.         Call ITheme_DrawBackgroundPropertyPages
  73.     End Select
  74.   End If
  75. End Sub
  76.  
  77. Private Sub ITheme_DrawBackgroundPropertyPages()
  78.   Call ITheme_DrawBackgroundTabbedDialog
  79. End Sub
  80.  
  81. Private Sub ITheme_DrawBackgroundTabbedDialog()
  82.   Dim iTmp As Integer
  83.   Dim utRect As RECT
  84.   
  85.   'get the larger of the active tab height and inactive tab height
  86.   iTmp = IIf(m_iActiveTabHeight > m_iInActiveTabHeight, m_iActiveTabHeight, m_iInActiveTabHeight)
  87.   
  88.   With m_oXTab
  89.     
  90.     'fill background color based on tab's enabled property
  91.     If .aryTabs(m_iActiveTab).Enabled Then
  92.       .lFillColor = m_lActiveTabBackStartColor
  93.     Else
  94.       .lFillColor = m_lDisabledTabBackColor
  95.     End If
  96.         
  97.     .iFillStyle = vbFSSolid   'must set to transparent (since we are setting it to Solid in the DrawTabs() )
  98.    
  99.     .pLine 0, iTmp + 1, m_iScaleWidth - 1, m_iScaleHeight - 1, m_lOuterBorderColor, True, False
  100.     
  101.     'erase the bottom line for active tab
  102.     utRect = .aryTabs(m_iActiveTab).ClickableRect
  103.     
  104.     If .aryTabs(m_iActiveTab).Enabled Then
  105.       .pLine utRect.Left + 1, utRect.Bottom - 1, utRect.Right - 1, utRect.Bottom - 1, m_lActiveTabBackStartColor, False, False
  106.     Else
  107.       .pLine utRect.Left + 1, utRect.Bottom - 1, utRect.Right - 1, utRect.Bottom - 1, m_lDisabledTabBackColor, False, False
  108.     End If
  109.     
  110.     
  111.  
  112.   End With
  113. End Sub
  114.  
  115. 'these functions were seperated acc to theme so as to allow painting of only the desired parts (and not the whole control)
  116. Private Sub ITheme_DrawOnActiveTabChange()
  117.   Call ITheme_DrawTabs
  118. End Sub
  119.  
  120. Private Sub ITheme_DrawTabs()
  121.   Call pCacheControlProperties     'cache the control proerties for faster access
  122.   With m_oXTab
  123.     Select Case .TabStyle
  124.       Case xStyleTabbedDialog:
  125.         Call ITheme_DrawTabsTabbedDialog
  126.       Case xStylePropertyPages:
  127.         Call Itheme_DrawTabsPropertyPages
  128.     End Select
  129.   End With
  130.   
  131.   m_bIsBackgroundPaintDelayed = True
  132.   
  133.   'draw bg again to give a nice effect
  134.   ITheme_DrawBackground
  135. End Sub
  136.  
  137.  
  138. Private Sub Itheme_DrawTabsPropertyPages()
  139.   Dim iCnt As Integer
  140.   Dim iTabWidth As Integer
  141.   Dim utFontRect As RECT
  142.   Dim sTmp As String
  143.   Dim utTabInfo As TabInfo
  144.   Dim iTmpW As Integer
  145.   Dim iTmpH As Integer
  146.   Dim iAdjustedIconSize As Integer
  147.   Dim iTmpX As Integer
  148.   Dim iTmpY As Integer
  149.   Dim iTmpHeight As Integer
  150.   Dim iOrigLeft As Integer
  151.   Dim iOrigRight As Integer
  152.  
  153.  
  154.   'Set the active tab's font as current font (since the TextWidth function
  155.   'will use the current font's size)
  156.   Set m_oXTab.oFont = m_oXTab.ActiveTabFont
  157.   
  158.   'store the larger height in tmp var
  159.   iTmpHeight = IIf(m_iActiveTabHeight > m_iInActiveTabHeight, m_iActiveTabHeight, m_iInActiveTabHeight)
  160.   
  161.   'initialize the clickable items
  162.   For iCnt = 0 To m_iTabCount - 1
  163.     utTabInfo = m_oXTab.aryTabs(iCnt)
  164.         
  165.     sTmp = Replace$(utTabInfo.Caption, "&&", "&")
  166.     
  167.     If InStr(1, sTmp, "&") Then
  168.       
  169.       'if still there is one '&' in the string then reduce the width by one more character (since the '&' will be conveted into an underline when painted)
  170.       sTmp = Mid$(sTmp, 1, Len(sTmp) - 1)
  171.     End If
  172.     
  173.     If utTabInfo.TabPicture Is Nothing Then
  174.       'get tab width acc to the text size and border
  175.       iTabWidth = m_oXTab.pTextWidth(sTmp) + m_c_iPROP_PAGE_BORDER_AND_TEXT_DISTANCE * 2
  176.     Else
  177.       If iTmpHeight - 2 < m_iIconSize Then    '-2 for borders
  178.         'here we adjust the size of the icon if it does not fit into current tab
  179.         iAdjustedIconSize = iTmpHeight - 2
  180.       Else
  181.         iAdjustedIconSize = m_iIconSize
  182.       End If
  183.  
  184.       'get tab width acc to the text size, border and Image
  185.       iTabWidth = m_oXTab.pTextWidth(sTmp) + (m_c_iPROP_PAGE_BORDER_AND_TEXT_DISTANCE * 2) + iAdjustedIconSize + 4
  186.     End If
  187.     
  188.     'following adjustments are used in case of property pages only. We must shift
  189.     'the left (+2) or (-2) to make it look like standard property pages
  190.     With utTabInfo.ClickableRect
  191.       If iCnt = 0 And iCnt <> m_iActiveTab Then
  192.         .Left = m_c_iPROP_PAGE_INACTIVE_TOP
  193.         .Right = .Left + iTabWidth - m_c_iPROP_PAGE_INACTIVE_TOP + 1
  194.       Else
  195.         If iCnt = 0 Then
  196.           .Left = 0
  197.         Else
  198.           .Left = m_oXTab.aryTabs(iCnt - 1).ClickableRect.Right + 1
  199.         End If
  200.           
  201.         .Right = .Left + iTabWidth
  202.       End If
  203.         
  204.       If iCnt = m_iActiveTab Then
  205.         If m_iActiveTabHeight > m_iInActiveTabHeight Then
  206.           .Top = 0
  207.         Else
  208.           .Top = m_iInActiveTabHeight - m_iActiveTabHeight
  209.         End If
  210.         .Bottom = .Top + m_iActiveTabHeight
  211.       Else
  212.         If m_iInActiveTabHeight > m_iActiveTabHeight Then
  213.           .Top = 0
  214.           .Bottom = .Top + m_iInActiveTabHeight
  215.         Else
  216.           .Top = m_iActiveTabHeight - m_iInActiveTabHeight
  217.           .Bottom = .Top + m_iInActiveTabHeight
  218.         End If
  219.         
  220.       End If
  221.       .Bottom = .Bottom + 2
  222.     End With
  223.     m_oXTab.aryTabs(iCnt) = utTabInfo
  224.   Next
  225.   
  226.   'fill the tab strip with TabStripBackColor (customizable... so that tab's can easily blend with the background)
  227.   m_oXTab.pLine 0, 0, m_iScaleWidth, IIf(m_iActiveTabHeight > m_iInActiveTabHeight, m_iActiveTabHeight, m_iInActiveTabHeight), m_oXTab.TabStripBackColor, True, True
  228.   
  229.   
  230.   'set the fill style to Solid
  231.   m_oXTab.iFillStyle = vbFSSolid
  232.  
  233.         
  234.   'Now Draw Each Tab
  235.   For iCnt = 0 To m_iTabCount - 1
  236.     utTabInfo = m_oXTab.aryTabs(iCnt)     'fetch local copy
  237.     
  238.     m_oXTab.lForeColor = m_lOuterBorderColor
  239.     
  240.     With utTabInfo.ClickableRect
  241.       
  242.       If iCnt = m_iActiveTab Then     'if we are drawing active tab
  243.         
  244.         
  245.         'we'll use solid colors for background (since we are calling RoundRect API)
  246.         If utTabInfo.Enabled Then
  247.           m_oXTab.lFillColor = m_lActiveTabBackStartColor
  248.         Else
  249.           m_oXTab.lFillColor = m_lDisabledTabBackColor
  250.         End If
  251.         
  252.         'draw round effect
  253.         Call RoundRect(m_lHDC, .Left, .Top, .Right, m_iScaleHeight - 1, m_iXRadius, m_iYRadius)
  254.  
  255.         Set m_oXTab.oFont = m_oXTab.ActiveTabFont       'set the font
  256.         
  257.         'set foreground color
  258.         If utTabInfo.Enabled Then
  259.           m_oXTab.lForeColor = m_lActiveTabForeColor
  260.         Else
  261.           m_oXTab.lForeColor = m_lDisabledTabForeColor
  262.         End If
  263.         
  264.       Else
  265.         
  266.         'we'll use solid colors for background (since we are calling RoundRect API)
  267.         If utTabInfo.Enabled Then
  268.           m_oXTab.lFillColor = m_lInActiveTabBackStartColor
  269.         Else
  270.           m_oXTab.lFillColor = m_lDisabledTabBackColor
  271.         End If
  272.         
  273.         'draw rounded rectangle
  274.         Call RoundRect(m_lHDC, .Left, .Top, .Right, m_iScaleHeight - 1, m_iXRadius, m_iYRadius)
  275.      
  276.         Set m_oXTab.oFont = m_oXTab.InActiveTabFont   'set the font
  277.         
  278.         'set foreground color
  279.         If utTabInfo.Enabled Then
  280.           m_oXTab.lForeColor = m_lInActiveTabForeColor
  281.         Else
  282.           m_oXTab.lForeColor = m_lDisabledTabForeColor
  283.         End If
  284.         
  285.       End If
  286.       
  287.       'do the adjustments for the border
  288.       utFontRect.Left = .Left
  289.       utFontRect.Top = .Top
  290.       utFontRect.Bottom = .Bottom
  291.       utFontRect.Right = .Right - 1
  292.  
  293.       
  294.       
  295.       If Not utTabInfo.TabPicture Is Nothing Then
  296.         
  297.         If utFontRect.Top + m_iIconSize > utFontRect.Bottom + 1 Then '+1 for minor adjustments
  298.           'adjust if going out of current tab's bottom
  299.           iAdjustedIconSize = (utFontRect.Bottom - 4) - utFontRect.Top
  300.         Else
  301.           iAdjustedIconSize = m_iIconSize
  302.         End If
  303.         
  304.         iTmpY = utFontRect.Top + Round((utFontRect.Bottom - utFontRect.Top - iAdjustedIconSize) / 2)
  305.                   
  306.         Select Case m_oXTab.PictureAlign
  307.           Case xAlignLeftEdge, xAlignLeftOfCaption:
  308.             
  309.             iTmpX = utFontRect.Left + 4 'move the icon a little far from left edge
  310.             
  311.           
  312.             If utTabInfo.TabPicture.Type = vbPicTypeBitmap And m_oXTab.UseMaskColor Then
  313.               
  314.               Call DrawImage(m_lHDC, utTabInfo.TabPicture.Handle, g_pGetRGBFromOLE(m_oXTab.PictureMaskColor), iTmpX, iTmpY, iAdjustedIconSize, iAdjustedIconSize)
  315.               
  316.             Else
  317.               
  318.               Call m_oXTab.pPaintPicture(utTabInfo.TabPicture, iTmpX, iTmpY, iAdjustedIconSize, iAdjustedIconSize)
  319.               
  320.             End If
  321.             
  322.             iOrigLeft = iTmpX + iAdjustedIconSize + 2
  323.             iOrigRight = iOrigLeft + (utFontRect.Right - utFontRect.Left)
  324.             utFontRect.Left = iOrigLeft
  325.              
  326.             
  327.           Case xAlignRightEdge, xAlignRightOfCaption:
  328.             iOrigLeft = utFontRect.Left
  329.             iOrigRight = utFontRect.Right
  330.             'utFontRect.Left = 5
  331.             utFontRect.Right = utFontRect.Right - iAdjustedIconSize - 2
  332.             
  333.         End Select
  334.         
  335.       End If
  336.       
  337.       
  338.       sTmp = utTabInfo.Caption
  339.       
  340.       'calculate the rect to draw the text, also modify the string to get ellipsis etc
  341.       DrawText m_lHDC, sTmp, -1, utFontRect, DT_CALCRECT Or DT_SINGLELINE Or DT_END_ELLIPSIS Or DT_MODIFYSTRING
  342.       
  343.       
  344.       iTmpW = utFontRect.Right - utFontRect.Left + m_c_iFOCUS_RECT_AND_TEXT_DISTANCE
  345.       iTmpH = utFontRect.Bottom - utFontRect.Top + m_c_iFOCUS_RECT_AND_TEXT_DISTANCE / 2
  346.       
  347.       
  348.       'do the adjustments to center the text (both vertically and horizontally)
  349.       'utFontRect.Left = (utFontRect.Left - (m_c_iFOCUS_RECT_AND_TEXT_DISTANCE / 2)) + .Right / 2 - utFontRect.Right / 2
  350.       utFontRect.Left = (utFontRect.Left + m_c_iPROP_PAGE_BORDER_AND_TEXT_DISTANCE)
  351.       If utTabInfo.TabPicture Is Nothing Then
  352.         utFontRect.Right = utFontRect.Left + iTmpW
  353.       Else
  354.         utFontRect.Right = utFontRect.Left + iTmpW - m_c_iPROP_PAGE_BORDER_AND_TEXT_DISTANCE
  355.       End If
  356.       
  357.       utFontRect.Top = utFontRect.Top + .Bottom / 2 - utFontRect.Bottom / 2
  358.       utFontRect.Bottom = utFontRect.Top + iTmpH
  359.       
  360.       If Not utTabInfo.TabPicture Is Nothing Then
  361.         
  362.         
  363.         Select Case m_oXTab.PictureAlign
  364.           Case xAlignLeftEdge, xAlignLeftOfCaption:
  365.             
  366.             utFontRect.Left = iOrigLeft
  367.           
  368.             'Now draw the text
  369.             DrawText m_lHDC, sTmp, -1, utFontRect, DT_SINGLELINE
  370.             
  371.           Case xAlignRightEdge, xAlignRightOfCaption:
  372.    
  373.         
  374.             iTmpW = utFontRect.Right
  375.             utFontRect.Right = iTmpW + m_c_iPROP_PAGE_BORDER_AND_TEXT_DISTANCE
  376.             
  377.             'Now draw the text
  378.             DrawText m_lHDC, sTmp, -1, utFontRect, DT_SINGLELINE
  379.             
  380.             iTmpX = utFontRect.Right + m_c_iPROP_PAGE_BORDER_AND_TEXT_DISTANCE - 2
  381.             
  382.             'utFontRect.Right = iTmpW
  383.             
  384.             'make sure our adjustment dosen't make it out of the font area
  385.             If iTmpX + iAdjustedIconSize > iOrigRight Then iTmpX = iOrigRight - iAdjustedIconSize
  386.             
  387.             If utTabInfo.TabPicture.Type = vbPicTypeBitmap And m_oXTab.UseMaskColor Then
  388.               
  389.               Call DrawImage(m_lHDC, utTabInfo.TabPicture.Handle, g_pGetRGBFromOLE(m_oXTab.PictureMaskColor), iTmpX, iTmpY, iAdjustedIconSize, iAdjustedIconSize)
  390.               
  391.             Else
  392.               
  393.               Call m_oXTab.pPaintPicture(utTabInfo.TabPicture, iTmpX, iTmpY, iAdjustedIconSize, iAdjustedIconSize)
  394.               
  395.             End If
  396.  
  397.           
  398.         End Select
  399.       Else
  400.             'Now draw the text
  401.             DrawText m_lHDC, sTmp, -1, utFontRect, DT_SINGLELINE
  402.       End If
  403.       
  404.  
  405.  
  406.       If m_oXTab.bUserMode Then    'only if in the run mode
  407.  
  408.         If iCnt = m_iActiveTab And m_bIsFocused And m_oXTab.ShowFocusRect Then
  409.           'show the focus rectangle
  410.           Call DrawFocusRect(m_lHDC, utFontRect)
  411.         End If
  412.       End If
  413.     End With
  414.   Next
  415.   
  416.  
  417. End Sub
  418.  
  419. Private Sub ITheme_DrawTabsTabbedDialog()
  420.   Dim iCnt As Integer
  421.   Dim iTabWidth As Integer
  422.   Dim utFontRect As RECT
  423.   Dim sTmp As String
  424.   Dim utTabInfo As TabInfo
  425.   Dim iTmpW As Integer
  426.   Dim iTmpH As Integer
  427.   Dim iTmpX As Integer
  428.   Dim iTmpY As Integer
  429.   Dim iOrigLeft As Integer
  430.   Dim iOrigRight As Integer
  431.   Dim iAdjustedIconSize As Integer
  432.   
  433.   
  434.   iTabWidth = m_iScaleWidth / m_iTabCount    'remember iTabWidth is an integer ... so the result is automatically rounded
  435.   
  436.   'initialize the clickable items
  437.   For iCnt = 0 To m_iTabCount - 1
  438.   
  439.     utTabInfo = m_oXTab.aryTabs(iCnt)
  440.     
  441.     'no need to calculate the text size(like in property pages).... since this is a tabbed dialog style
  442.     
  443.     With utTabInfo.ClickableRect
  444.       .Left = iCnt * iTabWidth
  445.       .Right = .Left + iTabWidth
  446.       
  447.       If iCnt = m_iActiveTab Then
  448.         If m_iActiveTabHeight > m_iInActiveTabHeight Then
  449.           .Top = 0
  450.         Else
  451.           .Top = m_iInActiveTabHeight - m_iActiveTabHeight
  452.         End If
  453.         .Bottom = .Top + m_iActiveTabHeight
  454.       Else
  455.         If m_iInActiveTabHeight > m_iActiveTabHeight Then
  456.           .Top = 0
  457.         Else
  458.           .Top = m_iActiveTabHeight - m_iInActiveTabHeight
  459.         End If
  460.         .Bottom = .Top + m_iInActiveTabHeight
  461.       End If
  462.       
  463.       .Bottom = .Bottom + 2
  464.     End With
  465.     
  466.     m_oXTab.aryTabs(iCnt) = utTabInfo
  467.   Next
  468.   
  469.   'if the last tab is shorter or longer than the usual size.. then adjust it to perfect size
  470.   utTabInfo.ClickableRect.Right = m_iScaleWidth
  471.   m_oXTab.aryTabs(iCnt - 1) = utTabInfo
  472.  
  473.   'added to prevent lines etc (we are filling the tab strip with the tab strip color)
  474.   m_oXTab.pLine 0, 0, m_iScaleWidth, IIf(m_iActiveTabHeight > m_iInActiveTabHeight, m_iActiveTabHeight, m_iInActiveTabHeight), m_oXTab.TabStripBackColor, True, True
  475.   
  476.   m_oXTab.iFillStyle = vbFSSolid
  477.   m_oXTab.lForeColor = m_lOuterBorderColor
  478.         
  479.   'Now Draw Each Tab
  480.   For iCnt = 0 To m_iTabCount - 1
  481.     utTabInfo = m_oXTab.aryTabs(iCnt)     'fetch local copy
  482.     
  483.     m_oXTab.lForeColor = m_lOuterBorderColor
  484.     
  485.     With utTabInfo.ClickableRect
  486.       
  487.       If iCnt = m_iActiveTab Then     'if we are drawing the active tab then
  488.         
  489.         
  490.         'we'll use solid colors for background (since we are calling RoundRect API)
  491.         If utTabInfo.Enabled Then
  492.           m_oXTab.lFillColor = m_lActiveTabBackStartColor
  493.         Else
  494.           m_oXTab.lFillColor = m_lDisabledTabBackColor
  495.         End If
  496.         
  497.         'draw rounded rectangle
  498.         Call RoundRect(m_lHDC, .Left, .Top, .Right, m_iScaleHeight - 1, m_iXRadius, m_iYRadius)
  499.  
  500.         Set m_oXTab.oFont = m_oXTab.ActiveTabFont       'set the font
  501.         
  502.         If utTabInfo.Enabled Then
  503.           m_oXTab.lForeColor = m_lActiveTabForeColor
  504.         Else
  505.           m_oXTab.lForeColor = m_lDisabledTabForeColor
  506.         End If
  507.         
  508.       Else                        'we are drawing inactive tab
  509.       
  510.         'we'll use solid colors for background (since we are calling RoundRect API)
  511.         If utTabInfo.Enabled Then
  512.           m_oXTab.lFillColor = m_lInActiveTabBackStartColor
  513.         Else
  514.           m_oXTab.lFillColor = m_lDisabledTabBackColor
  515.         End If
  516.         
  517.         'draw rounded rectangle
  518.         Call RoundRect(m_lHDC, .Left, .Top, .Right, m_iScaleHeight - 1, m_iXRadius, m_iYRadius)
  519.      
  520.         Set m_oXTab.oFont = m_oXTab.InActiveTabFont   'set the font
  521.         
  522.         If utTabInfo.Enabled Then
  523.           m_oXTab.lForeColor = m_lInActiveTabForeColor
  524.         Else
  525.           m_oXTab.lForeColor = m_lDisabledTabForeColor
  526.         End If
  527.         
  528.       End If
  529.  
  530.       'do the adjustments for the border
  531.       utFontRect.Left = .Left
  532.       utFontRect.Top = .Top
  533.       utFontRect.Bottom = .Bottom
  534.       utFontRect.Right = .Right - 1
  535.  
  536.     If Not utTabInfo.TabPicture Is Nothing Then
  537.         
  538.         If utFontRect.Top + m_iIconSize > utFontRect.Bottom + 1 Then '+1 for minor adjustments
  539.           'adjust if going out of current tab's bottom
  540.           iAdjustedIconSize = (utFontRect.Bottom - 4) - utFontRect.Top
  541.         Else
  542.           iAdjustedIconSize = m_iIconSize
  543.         End If
  544.         
  545.         iTmpY = utFontRect.Top + Round((utFontRect.Bottom - utFontRect.Top - iAdjustedIconSize) / 2)
  546.                   
  547.         Select Case m_oXTab.PictureAlign
  548.           Case xAlignLeftEdge:
  549.             iTmpX = utFontRect.Left + 4
  550.             
  551.             If iCnt = m_iActiveTab Then   'if active tab then give a comeup effect
  552.               iTmpX = iTmpX + 1
  553.               iTmpY = iTmpY - 1
  554.               
  555.               'make sure our adjustment dosen't make it out of the font area
  556.               If iTmpY < utFontRect.Top Then iTmpY = utFontRect.Top
  557.             End If
  558.             
  559.             If utTabInfo.TabPicture.Type = vbPicTypeBitmap And m_oXTab.UseMaskColor Then
  560.               
  561.               Call DrawImage(m_lHDC, utTabInfo.TabPicture.Handle, g_pGetRGBFromOLE(m_oXTab.PictureMaskColor), iTmpX, iTmpY, iAdjustedIconSize, iAdjustedIconSize)
  562.               
  563.             Else
  564.               
  565.               Call m_oXTab.pPaintPicture(utTabInfo.TabPicture, iTmpX, iTmpY, iAdjustedIconSize, iAdjustedIconSize)
  566.               
  567.             End If
  568.             
  569.           Case xAlignRightEdge:
  570.             iTmpX = utFontRect.Right - iAdjustedIconSize - 4
  571.             
  572.             If iCnt = m_iActiveTab Then 'if active tab then give a comeup effect
  573.               iTmpX = iTmpX - 1
  574.               iTmpY = iTmpY - 1
  575.               
  576.               'make sure our adjustment dosen't make it out of the font area
  577.               If iTmpY < utFontRect.Top Then iTmpY = utFontRect.Top
  578.             End If
  579.             
  580.             If utTabInfo.TabPicture.Type = vbPicTypeBitmap And m_oXTab.UseMaskColor Then
  581.               
  582.               Call DrawImage(m_lHDC, utTabInfo.TabPicture.Handle, g_pGetRGBFromOLE(m_oXTab.PictureMaskColor), iTmpX, iTmpY, iAdjustedIconSize, iAdjustedIconSize)
  583.               
  584.             Else
  585.               
  586.               Call m_oXTab.pPaintPicture(utTabInfo.TabPicture, iTmpX, iTmpY, iAdjustedIconSize, iAdjustedIconSize)
  587.               
  588.             End If
  589.             
  590.           Case xAlignLeftOfCaption:
  591.             iOrigLeft = utFontRect.Left
  592.           Case xAlignRightOfCaption:
  593.             iOrigRight = utFontRect.Right
  594.         End Select
  595.         
  596.       End If
  597.       
  598.       
  599.       sTmp = utTabInfo.Caption
  600.       
  601.       'calculate the rect to draw the text, also modify the string to get ellipsis etc
  602.       DrawText m_lHDC, sTmp, -1, utFontRect, DT_CALCRECT Or DT_SINGLELINE Or DT_END_ELLIPSIS Or DT_MODIFYSTRING
  603.       
  604.       
  605.       iTmpW = utFontRect.Right - utFontRect.Left + m_c_iFOCUS_RECT_AND_TEXT_DISTANCE
  606.       iTmpH = utFontRect.Bottom - utFontRect.Top + m_c_iFOCUS_RECT_AND_TEXT_DISTANCE / 2
  607.       
  608.       
  609.       'do the adjustments to center the text (both vertically and horizontally)
  610.       utFontRect.Left = (utFontRect.Left - (m_c_iFOCUS_RECT_AND_TEXT_DISTANCE / 2)) + .Right / 2 - utFontRect.Right / 2
  611.       utFontRect.Right = utFontRect.Left + iTmpW
  612.       
  613.       utFontRect.Top = utFontRect.Top + .Bottom / 2 - utFontRect.Bottom / 2
  614.       utFontRect.Bottom = utFontRect.Top + iTmpH
  615.       
  616.       
  617.       If Not utTabInfo.TabPicture Is Nothing Then
  618.         
  619.         Select Case m_oXTab.PictureAlign
  620.           Case xAlignLeftOfCaption:
  621.             iTmpX = utFontRect.Left - iAdjustedIconSize - 1
  622.             
  623.             'make sure our adjustment dosen't make it out of the font area
  624.             If iTmpX < iOrigLeft Then iTmpX = iOrigLeft
  625.             
  626.             If utTabInfo.TabPicture.Type = vbPicTypeBitmap And m_oXTab.UseMaskColor Then
  627.               
  628.               Call DrawImage(m_lHDC, utTabInfo.TabPicture.Handle, g_pGetRGBFromOLE(m_oXTab.PictureMaskColor), iTmpX, iTmpY, iAdjustedIconSize, iAdjustedIconSize)
  629.               
  630.             Else
  631.               
  632.               Call m_oXTab.pPaintPicture(utTabInfo.TabPicture, iTmpX, iTmpY, iAdjustedIconSize, iAdjustedIconSize)
  633.               
  634.             End If
  635.             
  636.           Case xAlignRightOfCaption:
  637.             iTmpX = utFontRect.Right + 1
  638.             
  639.             'make sure our adjustment dosen't make it out of the font area
  640.             If iTmpX + iAdjustedIconSize > iOrigRight Then iTmpX = iOrigRight - iAdjustedIconSize
  641.             
  642.             If utTabInfo.TabPicture.Type = vbPicTypeBitmap And m_oXTab.UseMaskColor Then
  643.               
  644.               Call DrawImage(m_lHDC, utTabInfo.TabPicture.Handle, g_pGetRGBFromOLE(m_oXTab.PictureMaskColor), iTmpX, iTmpY, iAdjustedIconSize, iAdjustedIconSize)
  645.               
  646.             Else
  647.               
  648.               Call m_oXTab.pPaintPicture(utTabInfo.TabPicture, iTmpX, iTmpY, iAdjustedIconSize, iAdjustedIconSize)
  649.               
  650.             End If
  651.  
  652.           
  653.         End Select
  654.       End If
  655.       
  656.       
  657.       'Now draw the text
  658.       DrawText m_lHDC, sTmp, -1, utFontRect, DT_SINGLELINE
  659.  
  660.       If m_oXTab.bUserMode Then    'only if in the run mode
  661.  
  662.         If iCnt = m_iActiveTab And m_bIsFocused And m_oXTab.ShowFocusRect Then
  663.           'draw focus rectangle
  664.           Call DrawFocusRect(m_lHDC, utFontRect)
  665.         End If
  666.       End If
  667.  
  668.  
  669.     End With
  670.  
  671.   Next
  672.   
  673.   'store the larger tab height
  674.   iCnt = IIf(m_iActiveTabHeight > m_iInActiveTabHeight, m_iActiveTabHeight, m_iInActiveTabHeight)
  675.  
  676.   'adjust the corners (whole tab control's corners)
  677.   m_oXTab.pLine 0, iCnt + 1, 0, iCnt + 4, m_lOuterBorderColor
  678.   m_oXTab.pLine m_iScaleWidth - 1, iCnt + 1, m_iScaleWidth - 1, iCnt + 4, m_lOuterBorderColor
  679.   
  680. End Sub
  681.  
  682. Private Sub ITheme_MouseDownHanlder(iButton As Integer, iShift As Integer, sngX As Single, sngY As Single)
  683.   Dim iCnt As Integer
  684.   Dim iX As Integer
  685.   Dim iY As Integer
  686.   Dim utTabInfo As TabInfo
  687.   
  688.   iX = CInt(sngX)
  689.   iY = CInt(sngY)
  690.   
  691.   If iY > IIf(m_iActiveTabHeight > m_iInActiveTabHeight, m_iActiveTabHeight, m_iInActiveTabHeight) Then
  692.       
  693.       'if lower than the larger tab height then exit sub since anything lower than
  694.       'active tab's height will not result in a tab switch
  695.       Exit Sub
  696.   End If
  697.                                                                                                             
  698.   
  699.   'now go through each tab's rect to determine if the mouse was clicked within its boundaries
  700.   For iCnt = 0 To m_iTabCount - 1
  701.     utTabInfo = m_oXTab.aryTabs(iCnt)
  702.     
  703.     If iX >= utTabInfo.ClickableRect.Left And iX <= utTabInfo.ClickableRect.Right And iY >= utTabInfo.ClickableRect.Top And iY <= utTabInfo.ClickableRect.Bottom And utTabInfo.Enabled Then
  704.       
  705.       'if its the active tab then no need to switch
  706.       If m_iActiveTab <> iCnt Then
  707.         m_oXTab.ActiveTab = iCnt
  708.       End If
  709.       Exit Sub  'our work is finished .... no need to itirate further
  710.     End If
  711.   Next
  712. End Sub
  713.  
  714. Private Sub ITheme_MouseMoveHanlder(iButton As Integer, iShift As Integer, sngX As Single, sngY As Single)
  715.   'not used
  716. End Sub
  717.  
  718. Private Sub ITheme_MouseUpHanlder(iButton As Integer, iShift As Integer, sngX As Single, sngY As Single)
  719.   'Do Nothing
  720. End Sub
  721.  
  722. 'IMPORTANT: must be called before anything else is called... this function is called in the usercontrol
  723. 'the time the object is instantiated
  724. Private Sub ITheme_SetControl(oXTab As XTab)
  725.   Set m_oXTab = oXTab
  726.   m_oXTab.bAutoRedraw = False
  727. End Sub
  728.  
  729. Private Sub ITheme_ShowHideFocus()
  730.   Call pCacheControlProperties
  731.   Select Case m_oXTab.TabStyle
  732.     Case xStylePropertyPages
  733.       ITheme_ShowHideFocusPropertyPages
  734.     Case xStyleTabbedDialog
  735.       ITheme_ShowHideFocusTabbedDialog
  736.   End Select
  737. End Sub
  738.  
  739. Private Sub ITheme_ShowHideFocusPropertyPages()
  740.   Dim utFontRect As RECT
  741.   Dim utTabInfo As TabInfo
  742.   Dim iTmpW As Integer
  743.   Dim iTmpH As Integer
  744.   Dim sTmp As String
  745.   Dim iAdjustedIconSize As Integer
  746.   Dim iOrigLeft As Integer
  747.   
  748.   
  749.   If Not m_oXTab.bUserMode Then       'only if in the run mode
  750.     
  751.     Exit Sub
  752.     
  753.   End If
  754.   
  755.   If Not m_oXTab.ShowFocusRect Then   'only if Show Focus Rect is true for the control
  756.       
  757.     Exit Sub
  758.     
  759.   End If
  760.   
  761.   utTabInfo = m_oXTab.aryTabs(m_iActiveTab)
  762.   With utTabInfo.ClickableRect
  763.     'do the adjustments for the border
  764.     utFontRect.Left = .Left
  765.     utFontRect.Top = .Top
  766.     utFontRect.Bottom = .Bottom
  767.     utFontRect.Right = .Right - 1
  768.  
  769.     sTmp = utTabInfo.Caption
  770.     
  771.     If Not utTabInfo.TabPicture Is Nothing Then
  772.       
  773.       If utFontRect.Top + m_iIconSize > utFontRect.Bottom + 1 Then '+1 for minor adjustments
  774.         'adjust if going out of current tab's bottom
  775.         iAdjustedIconSize = (utFontRect.Bottom + 1) - utFontRect.Top
  776.       Else
  777.         iAdjustedIconSize = m_iIconSize
  778.       End If
  779.       
  780.       Select Case m_oXTab.PictureAlign
  781.         Case xAlignLeftEdge, xAlignLeftOfCaption:
  782.           iOrigLeft = utFontRect.Left
  783.           utFontRect.Left = utFontRect.Left + iAdjustedIconSize - 1
  784.       End Select
  785.       
  786.     End If
  787.           
  788.     
  789.     'set the active tab font as current font... used to get proper values when calculating text size
  790.     Set m_oXTab.oFont = m_oXTab.ActiveTabFont
  791.     
  792.     'calculate the rect to draw the text, and get proper string (including ellipsis etc)
  793.     DrawText m_lHDC, sTmp, -1, utFontRect, DT_CALCRECT Or DT_SINGLELINE Or DT_END_ELLIPSIS Or DT_MODIFYSTRING
  794.     
  795.     
  796.     iTmpW = utFontRect.Right - utFontRect.Left + m_c_iFOCUS_RECT_AND_TEXT_DISTANCE
  797.     iTmpH = utFontRect.Bottom - utFontRect.Top + m_c_iFOCUS_RECT_AND_TEXT_DISTANCE / 2
  798.     
  799.     
  800.     'do the adjustments to center the text (both vertically and horizontally)
  801.     utFontRect.Left = (utFontRect.Left + m_c_iPROP_PAGE_BORDER_AND_TEXT_DISTANCE)
  802.     utFontRect.Right = utFontRect.Left + iTmpW
  803.     
  804.     utFontRect.Top = utFontRect.Top + .Bottom / 2 - utFontRect.Bottom / 2
  805.     utFontRect.Bottom = utFontRect.Top + iTmpH
  806.  
  807.     If utTabInfo.Enabled Then             'done to allow proper drawing of focus rect
  808.       m_oXTab.lForeColor = m_lActiveTabForeColor
  809.     Else
  810.       m_oXTab.lForeColor = m_lDisabledTabForeColor
  811.     End If
  812.     
  813.     Select Case m_oXTab.PictureAlign
  814.       Case xAlignRightEdge, xAlignRightOfCaption:
  815.         'utFontRect.Right = utFontRect.Right - 2
  816.     End Select
  817.     
  818.     'show/hide the focus rectangle (drawn in XOR mode, so calling it again with same coords will erase it)
  819.     Call DrawFocusRect(m_lHDC, utFontRect)
  820.   End With
  821. End Sub
  822.  
  823. Private Sub ITheme_ShowHideFocusTabbedDialog()
  824.   Dim utFontRect As RECT
  825.   Dim sTmp As String
  826.   Dim utTabInfo As TabInfo
  827.   Dim iTmpW As Integer
  828.   Dim iTmpH As Integer
  829.   
  830.   If Not m_oXTab.bUserMode Then       'only if in the run mode
  831.     
  832.     Exit Sub
  833.     
  834.   End If
  835.   
  836.   If Not m_oXTab.ShowFocusRect Then   'only if Show Focus Rect is true for the control
  837.       
  838.     Exit Sub
  839.     
  840.   End If
  841.   
  842.   utTabInfo = m_oXTab.aryTabs(m_iActiveTab)
  843.   With utTabInfo.ClickableRect
  844.     'do the adjustments for the border
  845.     utFontRect.Left = .Left
  846.     utFontRect.Top = .Top
  847.     utFontRect.Bottom = .Bottom
  848.     utFontRect.Right = .Right - 1
  849.  
  850.     sTmp = utTabInfo.Caption
  851.     
  852.     'set the active tab font as current font... used to get proper values when calculating text size
  853.     Set m_oXTab.oFont = m_oXTab.ActiveTabFont
  854.     
  855.     'calculate the rect to draw the text, and get proper string (including ellipsis etc)
  856.     DrawText m_lHDC, sTmp, -1, utFontRect, DT_CALCRECT Or DT_SINGLELINE Or DT_END_ELLIPSIS Or DT_MODIFYSTRING
  857.     
  858.     
  859.     iTmpW = utFontRect.Right - utFontRect.Left + m_c_iFOCUS_RECT_AND_TEXT_DISTANCE
  860.     iTmpH = utFontRect.Bottom - utFontRect.Top + m_c_iFOCUS_RECT_AND_TEXT_DISTANCE / 2
  861.     
  862.     
  863.     'do the adjustments to center the text (both vertically and horizontally)
  864.     utFontRect.Left = (utFontRect.Left - (m_c_iFOCUS_RECT_AND_TEXT_DISTANCE / 2)) + .Right / 2 - utFontRect.Right / 2
  865.     utFontRect.Right = utFontRect.Left + iTmpW
  866.     
  867.     utFontRect.Top = utFontRect.Top + .Bottom / 2 - utFontRect.Bottom / 2
  868.     utFontRect.Bottom = utFontRect.Top + iTmpH
  869.       
  870.     If utTabInfo.Enabled Then             'done to allow proper drawing of focus rect
  871.       m_oXTab.lForeColor = m_lActiveTabForeColor
  872.     Else
  873.       m_oXTab.lForeColor = m_lDisabledTabForeColor
  874.     End If
  875.     
  876.     'show/hide the focus rectangle (drawn in XOR mode, so calling it again with same coords will erase it)
  877.     Call DrawFocusRect(m_lHDC, utFontRect)
  878.  
  879.   End With
  880. End Sub
  881.  
  882.  
  883. Private Sub ITheme_TimerEvent()
  884.   'Do Nothing (will never be called for this theme)
  885. End Sub
  886.  
  887. 'function will reset all the colors back to default colors
  888. Private Sub ITheme_ResetColorsToDefault()
  889.   With m_oXTab
  890.     
  891.     .ActiveTabBackStartColor = &HF8F8F8
  892.     
  893.     'Not used in this Theme
  894.     '.ActiveTabBackEndColor
  895.     
  896.     .ActiveTabForeColor = &HA76D50
  897.     
  898.     .InActiveTabBackStartColor = &HE5E5E5
  899.     
  900.     'Not used in this Theme
  901.     '.InActiveTabBackEndColor
  902.     .InActiveTabForeColor = &H909090
  903.     
  904.     .TabStripBackColor = vbButtonFace
  905.     .DisabledTabBackColor = vbButtonFace
  906.     .DisabledTabForeColor = vb3DDKShadow
  907.     
  908.     '.TopLeftInnerBorderColor = vb3DHighlight
  909.     .OuterBorderColor = &H909090
  910.     '.BottomRightInnerBorderColor = vb3DShadow
  911.     
  912.     'Not Reset for this theme
  913.     ' .HoverColorInverted
  914.   End With
  915. End Sub
  916.  
  917. '=====================================================================================================================
  918.  
  919.  
  920. '==== Private Functions ==============================================================================================
  921.  
  922. 'cache the properties from the control (this prevents trips to again and again fetch properties from the user control)
  923. Private Sub pCacheControlProperties()
  924.   m_lHDC = m_oXTab.lhDC
  925.   m_iActiveTab = m_oXTab.ActiveTab
  926.   m_iActiveTabHeight = m_oXTab.ActiveTabHeight
  927.   m_iInActiveTabHeight = m_oXTab.InActiveTabHeight
  928.   m_iScaleWidth = m_oXTab.iScaleWidth
  929.   m_iScaleHeight = m_oXTab.iScaleHeight
  930.   m_iTabCount = m_oXTab.TabCount
  931.   m_bIsFocused = m_oXTab.bIsFocused
  932.   m_lOuterBorderColor = m_oXTab.OuterBorderColor
  933.   
  934.   m_lActiveTabForeColor = m_oXTab.ActiveTabForeColor
  935.   m_lActiveTabBackStartColor = m_oXTab.ActiveTabBackStartColor
  936.   
  937.   
  938.   m_lInActiveTabForeColor = m_oXTab.InActiveTabForeColor
  939.   m_lInActiveTabBackStartColor = m_oXTab.InActiveTabBackStartColor
  940.   
  941.   m_lDisabledTabBackColor = m_oXTab.DisabledTabBackColor
  942.   m_lDisabledTabForeColor = m_oXTab.DisabledTabForeColor
  943.   m_iXRadius = m_oXTab.XRadius
  944.   m_iYRadius = m_oXTab.YRadius
  945.   
  946.   'Get System's default size for a Icon.
  947.   If m_oXTab.PictureSize = xSizeSmall Then
  948.     m_iIconSize = GetSystemMetrics(SM_CXSMICON)
  949.   Else
  950.     m_iIconSize = GetSystemMetrics(SM_CXICON)
  951.   End If
  952. End Sub
  953. '=====================================================================================================================
  954.  
  955.